Toradex WinCE 库演进:新的库文件方法说明
1). 概述
Windows十多年之前,为了演示我们的 计算机模块 ,或者称为 系统模块(SoM),我们编写了一些WinCE 的代码。例如 GPIO、I2C、模拟输入等。当时我们只是为了纯粹的演示目的,并没有关系诸如维护、不同模块之间的兼容性等问题。然而,这些演示程序却被大量 Windows Embedded Compact 用户所采用。我们收到越来越多的技术支持和功能要求,于是我们开始将其集成到演示代码中去。最终,我们有了今天的针对基于 PXA 和 Tegra® 系统模块的库文件包。通过这些库文件可以可靠和方便地使用我们的模块。但是,迭代维护和为新功能提供 API 却没有那么容易。
当我们为我们的模块系列家族添加新的处理器(片上系统或者 SoC),我们决定停止扩展旧的 API,而是采用一套全新的 API,我们可以把过去获得的经验都倾注其中。我们称这套新的库文件包为“Toradex CE Libraries”。该库文件包的目标和我们原来的一样:使我们的用户能够方便地使用系统模块的功能。
但是,我们三个非常重要的要求:
./ 可扩展,并可兼容的 API
./ 允许通过注册表配置库文件
./ 易于维护
我们将在新的库文件包中满足三个所有的要求。
2). 可扩展,并可兼容的API
为了保持我们的 API 满足将来的需求,我们决定引入两套调用 API。第一种是通常的做法,使用字符串或者整数将信息传递给库。下面演示了如何将一个系统模块的引脚设置为 GPIO 输入,并调用 SetConfigString 函数激活下拉电阻:
-----------------------------
// Set pin to alternate function GPIO,Input with pull-down
success = Gpio_SetConfigString(hGpio, io1,NULL, L"altfn=ioAltFnGpio,dir=in,pull=down", StoreVolatile);
-----------------------------
另外一个例子是调用 SetConfigInt 函数将 I2C 控制器的速率设置为 400KHz:
-----------------------------
// Set I2C speed to 400KHz
success = I2c_SetConfigInt(i2c,L"BitRateHz", 400000, StoreVolatile);
-----------------------------
采用字符串的方法允许我们保持 API 的 100% 兼容,并且在将来可以添加现在系统模块还没有的更多功能。
第二套调用的 API 主要出于性能或者采用标准函数的原因。下面是一个 GPIO 库文件中修改一个 GPIO 的函数例程。调用 SetConfigString 或者 Set ConfigInt 可以实现同样的目的,出于性能考虑,我们提供了不需要字符串解析的函数。
-----------------------------
// Set it to Output, High
Gpio_ConfigureAsGpio(hGpio, io1);
Gpio_SetDir (hGpio, io1, ioOutput);
Gpio_SetLevel (hGpio, io1, ioHigh);
-----------------------------
我们看看采用标准函数读取 I2C 的例程。因为性能缘故,我们决定不采用一般字符串的方法(例如上的 Get/SetConfig),但是由于读 I2C(以及类似的函数)已经固定,无法针对将来的 SoC 做改变。
-----------------------------
returnValue = I2c_Read(i2c, (DWORD*) data,8);
-----------------------------
3). 允许通过注册表配置库文件
正如前面看到的,我们可以通过字符串和整数配置库文件。例如也可以在注册表中配置 SPI 库使用特定 SPI 接口、片选信号、波特率等,在你的应用启动的时候加载配置。如果你采用下面的方法加载库:
-----------------------------
hSPI = Spi_Init(L"SPI2");
-----------------------------
库文件会自动从注册表下面的位置加载配置:
-----------------------------
[HKEY_LOCAL_MACHINE\SOFTWARE\Toradex\SPI2]
BitRateHz=500000
DmaEnable=1
etc.
-----------------------------
你也许会想,这有什么好处。其中一个很好的优势是,可以针对不同设备只维护一个应用。例如,你可以在基于 NXP®(或者可以写为高通)i.MX6 处理器以及 NXP Vybrid 系统模块上使用相同的应用。模块之间唯一的不同是引脚配置,现在这些可以保持在注册表中。剩余的部分完全相同,因此允许你在不同的系统模块上使用一个二进制应用,使得您的开发更加容易。
4). 易于维护
在本文的最后我想重点介绍“为维护而设计”方面。为了我们能够简单、安全地维护,我们根据每一种 SoC 将库文件分为单独的源代码文件。这确保我们能够在修复漏洞或者增加 SoC 相关功能的时候,保持其他 SoC 部分的代码不变。这降低了破坏现有代码的风险,因此也使得我们的软件总体上更加稳健。
5). 参考
您可以在我们的开发者中心 中找到所支持功能的列表以及下载库文件、API说明等。
同样欢迎您查看我们的library roadmap,我们公开了所以已知的问题和我们计划解决的时间。
提交
Verdin AM62 LVGL 移植
基于 NXP iMX8MM 测试 Secure Boot 功能
隆重推出 Aquila - 新一代 Toradex 计算机模块
Verdin iMX8MP 调试串口更改
NXP iMX8MM Cortex-M4 核心 GPT Capture 测试